<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/model/DAO/mysql/DataBase.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Entity.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Process.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Post.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/model/Service/Service.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/model/DAO/ProcessDAO.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/exceptions/DataBaseException.php';
// удалить, это здесь для тестирования работоспособности!!!
require_once $_SERVER['DOCUMENT_ROOT'].'/model/Service/ServiceFactory.php';

class ProcessDAOImpl extends ProcessDAO {

	public function create(Entity $process) {
		/*		$sql = 'INSERT INTO `process` (`code`,`name`,`object`,`id_owner`)';
		 $sql .= 'VALUES ("'.$process->getCode().'"';
		 		$sql .= ',"'.$process->getName().'"';
		 		$sql .= ',"'.$process->getObject().'"';
		 		$sql .= ','.$process->getOwner()->getIdentity();
		 		$sql .= ')';
		try {
		$this->query($sql);
		$process->setIdentity($this->identity());
		return $process;
		} catch(DataBaseException $excepton) {
		return null;
		}
		*/

		$code = $process->getCode();
		$name = $process->getName();
		$object = $process->getObject();
		$ownerId = $process->getOwner()->getIdentity();

		$stmt = $this->dbh->connection->prepare('INSERT INTO `process` (`code`, `name`, `object`, `id_owner`) VALUES (?, ?, ?, ?)');
		$stmt->bindValue(1, $code);
		$stmt->bindValue(2, $name);
		$stmt->bindValue(3, $object);
		$stmt->bindValue(4, $ownerId);

		try {
			$this->dbh->query($stmt);
			$process->setIdentity($this->dbh->identity());
			return $process;
		} catch (PDOException $exception) {
			return null;
		}

	}

	// для редактирования процесса нам нужно знать о нем все
	public function read($identity) {
		/*		$processes = $this->build('`id`='.((int)$identity),true);
		 if(count($processes) == 1) {
		return $processes[0];
		} else {
		return null;
		}
		*/

		$id = ((int)$identity);
		$params= array("1"=>$id);
		$processes = $this->build('`id`=?',$params);
		if(count($processes) == 1) {
			return $processes[0];
		} else {
			return null;
		}

	}

	public function update(Entity $process) {
		/*		$sql = 'UPDATE `process` ';
		 $sql .= 'SET `code`="'.$process->getCode().'"';
		$sql .= ',`name`="'.$process->getName().'"';
		$sql .= ',`object`="'.$process->getObject().'"';
		$sql .= ',`id_owner`='.$process->getOwner()->getIdentity();
		$sql .= ' WHERE `id`='.$process->getIdentity();
		try {
		$this->query($sql);
		return $process;
		} catch(DataBaseException $excepton) {
		return null;
		}
		*/

		$code = $process->getCode();
		$name = $process->getName();
		$object = $process->getObject();
		$ownerId = $process->getOwner()->getIdentity();
		$id = $process->getIdentity();

		$stmt = $this->dbh->connection->prepare('UPDATE `process` SET `code`=?, `name`=?, `object`=?, `id_owner`=? WHERE `id`=?');
		$stmt->bindValue(1, $code);
		$stmt->bindValue(2, $name);
		$stmt->bindValue(3, $object);
		$stmt->bindValue(4, $ownerId);
		$stmt->bindValue(5, $id);

		try {
			$this->dbh->query($stmt);
			return $process;
		} catch (PDOException $exception) {
			return null;
		}

	}

	public function delete($identity) {
		/*		$sql = 'DELETE FROM `process` ';
		 $sql .= 'WHERE `id`='.((int)$identity);
		try {
		$this->query($sql);
		return true;
		} catch(DataBaseException $exception) {
		return false;
		}
		*/

		$id = (int)($identity);

		$stmt = $this->dbh->connection->prepare('DELETE FROM `process` WHERE `id`=?');
		$stmt->bindValue(1, $id);

		try {
			$this->dbh->query($stmt);
			return true;
		} catch (PDOException $exception) {
			return false;
		}

	}

	// Список всех процессов без связанных с ними показателях процессов
	public function getAll() {
		return $this->build(null,null);
	}

	// Список всех процессов без связанных с ними показателях процессов
	// TODO: возможно лишний метод Пока нигде не используется
	public function readProcess($identity) {
		/*		$processes = $this->build('`id`='.((int)$identity),false);
		 if(count($processes) == 1) {
		return $processes[0];
		} else {
		return null;
		}
		*/
		$id = ((int)$identity);
		$params = array("1"=>$id);
		$processes = $this->build('`id`=?',$params);
		if(count($processes) == 1) {
			return $processes[0];
		} else {
			return null;
		}

	}

	// создает массив экземпляров класса Process на основе SQL-запроса на выборку с условием $condition
	private function build($condition,$params) {
		/*		$sql = 'SELECT `id`,`code`,`name`,`object`,`id_owner`';
		 $sql .= 'FROM `process`';
		if($condition !== null) {
		$sql .= ' WHERE '.$condition;
		}
		$this->query($sql);
		$processes = array();

		while($row = $this->row()) {
		$process = new Process();
		$process->setIdentity($row['id']);
		$process->setCode($row['code']);
		$process->setName($row['name']);
		$process->setObject($row['object']);
			
		$service = getService('PostService');
		$post = new Post();
		$post = $service->read($row['id_owner']);
			
		$process->setOwner($post);
		$processes[] = $process;
		}
		$this->close();

		if ($withIndicators){
		// собираем показатели, относящиеся к этому процессу
		$serviceIndicator = getService('IndicatorService');
			
		foreach($processes as $process) {
		$serviceIndicator->getIndicatorsForProcess($process);
		}
		}
		return $processes;
		*/

		$sql = 'SELECT `id`, `code`, `name`, `object`, `id_owner` FROM `process`';
		if($condition !== null) {
			$sql = ' WHERE '.$condition;
			$stmt = $this->dbh->connection->prepare($sql);
			if($condition !== null) {
				foreach ($params as $i=>$value){
					$stmt->bindValue($i, $value);
				}
				$this->dbh->query($stmt);
			}else{
				$this->dbh->execute($sql);
			}
		}
		$process = array();
		while($row = $this->dbh->row()) {
			$process = new Process();
			$process->setIdentity($row['id']);
			$process->setCode($row['code']);
			$process->setName($row['name']);
			$process->setObject($row['object']);
				
// 			// удалить потом это!!!
// 			$serviceFactoy = new ServiceFactory(); // Создаем фабрику сервисов
// 			$service = $serviceFactoy->getService('PostService');// Получаем нужный сервис
// 			// это раскомментить, это исходное!!!
// 			//$service = getService('PostService');
				
			$post = new Post();
			$post->setIdentity($row['id_owner']);
				
			$process->setOwner($post);
			$processes[] = $process;
		}
		$this->dbh->close();
// 			// удалить потом это!!!
// 			$serviceIndicator = $serviceFactoy->getService('IndicatorService');// Получаем нужный сервис
// 			// собираем показатели, относящиеся к этому процессу
// 			// это раскомментить, это исходное!!!
// 			//$serviceIndicator = getService('IndicatorService');
				
// 			foreach($processes as $process) {
// 				$serviceIndicator->getIndicatorsForProcess($process);
// 			}

		return $processes;

	}

}
?>